package com.rw.coco.api.reply.mapper;

import com.rw.coco.api.data.model.CharacterPropertyModel;
import com.rw.coco.expression.DiceExpression;
import com.rw.coco.handler.message.event.CocoGroupMessageEvent;
import com.rw.coco.handler.message.event.CocoMessageEvent;
import com.rw.coco.handler.message.reply.handler.command.bean.CocoProp;
import com.rw.coco.handler.message.reply.handler.command.bean.RAResult;
import com.rw.coco.handler.message.reply.handler.command.bean.RARule;
import com.rw.tool.util.expression.exception.ExpressionException;

import java.util.List;
import java.util.Set;

/**
 * 和骰子指令相关的回复
 */
public interface DiceReply {
    /**
     * 数字超大异常，设置的数字过大，导致parseInt失败
     *
     * @param event 聊天事件
     */
    String numberOverflowException(CocoMessageEvent event);

    /**
     * roll点的回复
     *
     * @param event      聊天事件
     * @param reason     扔骰子的原因
     * @param expression 扔骰子的表达式
     */
    String roll(CocoMessageEvent event, String reason, String expression);

    /**
     * 暗骰在群中的回复内容，不包括投骰子结果
     *
     * @param event      聊天事件
     * @param reason     扔骰子的原因
     * @param expression 扔骰子的表达式
     */
    String privateRollReply(CocoGroupMessageEvent event, String reason, String expression);

    /**
     * 暗骰在私聊中回复的投骰结果
     *
     * @param event      聊天事件
     * @param reason     扔骰子的原因
     * @param expression 扔骰子的表达式
     */
    String privateRollResult(CocoGroupMessageEvent event, String reason, String expression);

    /**
     * 表达式报错
     *
     * @param exception 报错信息
     */
    String expressionException(ExpressionException exception);

    /**
     * 设置属性错误
     *
     * @param event         聊天事件
     * @param errorPosition 错误信息片段
     */
    String setPropError(CocoMessageEvent event, String errorPosition);

    /**
     * 设置属性成功
     *
     * @param event 聊天事件
     */
    String setPropSuccess(CocoMessageEvent event);

    /**
     * 设置属性，但是设置的属性为空
     *
     * @param event 聊天事件
     */
    String setPropEmpty(CocoMessageEvent event);

    /**
     * st show 指令，但是没有找到用户对应的属性
     *
     * @param event    聊天事件
     * @param propName 属性名
     */
    String setShowNotFindProp(CocoMessageEvent event, String propName);

    /**
     * st show 指令，展示某一样属性
     *
     * @param event 聊天事件
     * @param model 属性名
     */
    String setShowOne(CocoMessageEvent event, CharacterPropertyModel model);

    /**
     * st show 指令，展示全部属性
     *
     * @param event      聊天事件
     * @param properties 全部属性
     */
    String setShowAll(CocoMessageEvent event, Set<CharacterPropertyModel> properties);

    /**
     * st指令，但是属性设置超过了设定范围
     *
     * @param event    聊天事件
     * @param cocoProp 属性
     * @param minValue 允许的最小值
     * @param maxValue 允许的最大值
     */
    String setPropOutOfRange(CocoMessageEvent event, CocoProp cocoProp, int minValue, int maxValue);

    /**
     * 清除所有属性
     *
     * @param event 聊天事件
     */
    String clearAllProp(CocoMessageEvent event);

    /**
     * 删除指令
     *
     * @param event    聊天事件
     * @param propName 属性名
     */
    String delete(CocoMessageEvent event, String propName);

    /**
     * 删除，但是未找到对应属性
     *
     * @param event    聊天事件
     * @param propName 属性名
     */
    String deleteButNotFound(CocoMessageEvent event, String propName);

    /**
     * ra指令，但后续没有跟任何字符
     *
     * @param event 聊天事件
     */
    String raEmpty(CocoMessageEvent event);

    /**
     * ra指令，但是没有找到用户对应的属性
     *
     * @param event    聊天事件
     * @param propName 属性名
     */
    String raNotFindProp(CocoMessageEvent event, String propName);

    /**
     * ra指令，但是指令格式错误
     *
     * @param event        聊天事件
     * @param errorCommand 原指令
     * @param index        指令错误位置
     */
    String raCommandError(CocoMessageEvent event, String errorCommand, int index);

    /**
     * 设置的奖励/惩罚骰子过多
     *
     * @param event    聊天事件
     * @param count    设置的奖励/惩罚骰子
     * @param maxCount 最大允许的骰子数
     */
    String tooManyBonuses(CocoMessageEvent event, int count, int maxCount);

    /**
     * 设置的检定次数过多
     *
     * @param event    聊天事件
     * @param count    设置的检定次数
     * @param maxCount 最大允许的检定次数
     */
    String tooManyCount(CocoMessageEvent event, int count, int maxCount);

    /**
     * 设置的属性值过大
     *
     * @param event  聊天事件
     * @param num    设置的属性值
     * @param maxNum 允许的最大属性值
     */
    String propNumTooBig(CocoMessageEvent event, int num, int maxNum);

    /**
     * 检定结果
     *
     * @param event        聊天事件
     * @param raRule       检定的规则
     * @param raResultList 检定的结果列表
     */
    String raResult(CocoMessageEvent event, RARule raRule, List<RAResult> raResultList);

    /**
     * 群聊暗骰，在群中的部分回复
     *
     * @param event    聊天事件
     * @param propName 检定的属性
     */
    String privateRAReply(CocoGroupMessageEvent event, String propName);

    /**
     * 群聊暗骰，在私聊中的回复
     *
     * @param event  聊天事件
     * @param result 检定的结果
     */
    String privateRAResult(CocoGroupMessageEvent event, String result);

    /**
     * 更改昵称，但是没有输入昵称
     *
     * @param event 聊天事件
     */
    String nnNotFound(CocoMessageEvent event);

    /**
     * 清除昵称
     *
     * @param event 聊天事件
     */
    String nnClear(CocoMessageEvent event);

    /**
     * 变更昵称
     *
     * @param event 聊天事件
     * @param nick  昵称
     */
    String nn(CocoMessageEvent event, String nick);

    /**
     * sc理智检定，但是表达式不正确
     *
     * @param event     聊天事件
     * @param scCommand 错误的表达式
     */
    String scParseError(CocoMessageEvent event, String scCommand);

    /**
     * sc理智检定，检定失败
     *
     * @param event          聊天事件
     * @param diceExpression 骰子中缀表达式
     * @param san            原本的san值
     * @param minus          扣除的san值
     * @param randomNum      随机出来的数值
     */
    String scFail(CocoMessageEvent event, DiceExpression diceExpression, int san, int minus, int randomNum);


    /**
     * sc理智检定，检定成功
     *
     * @param event          聊天事件
     * @param diceExpression 骰子中缀表达式
     * @param san            原本的san值
     * @param minus          扣除的san值
     * @param randomNum      随机出来的数值
     */
    String scSuccess(CocoMessageEvent event, DiceExpression diceExpression, int san, int minus, int randomNum);
}
